WhiteDLG's

门控注意力:消灭 Attention Sink
Qwen 团队的简单暴力美学

2026-2-7 LLM / Transformer

门控注意力 (Gated Attention)

阿里 Qwen 团队最新论文提出:只要在注意力输出后加一个简单的 Sigmoid 门控,就能显著提升模型性能,并彻底消灭困扰 Transformers 的注意力塌陷(Attention Sink)问题。

1. 数学定义

在论文的 2.2 Augmenting Attention Layer with Gating Mechanisms 章节(第3页),作者给出了明确的数学定义:

$$Y' = g(Y, X, W_{\theta}, \sigma) = Y \odot \sigma(XW_{\theta})$$
  • $Y$:原本要输出的信号(比如 Attention 的计算结果)。
  • $X$:用来计算门控分数的输入(论文中取的是 LayerNorm 之后的 hidden states)。
  • $W_{\theta}$:可学习的门控参数矩阵。
  • $\sigma$:激活函数(这里选用了 Sigmoid,因为它输出 0 到 1 之间的值,非常适合做“开关”)。
  • $\odot$:逐元素乘法(Element-wise multiplication)。

直白解释:这个公式的意思是,模型会根据当前的输入 $X$,算出一个 0 到 1 之间的分数(Gating Score)。

  • 如果分数接近 1:原来的信息 $Y$ 几乎全保留。
  • 如果分数接近 0:原来的信息 $Y$ 被抹除/抑制。

作者认为这起到了“动态滤波器(dynamic filter)”的作用,可以根据上下文选择性地保留或擦除特征。

代码的实现

代码实现示意图

可复现的 Demo

可直接用于 PyTorch 的代码块(兼容 huggingface-style Attention):

Demo 代码示例

2. 门控注意力添加的位置

论文对比了 5 个不同的位置,最终发现效果最好的是 $G_1$ 位置:

  • 位置: 在 Scaled Dot-Product Attention (SDPA) 输出之后,在多头拼接(Concatenation)和最终输出层(Output Layer)之前。
  • 形式: Head-Specific(每个注意力头有独立的门控) + Element-wise(每个维度都有独立的门控值)。
门控添加位置图示

3. 注意力缺陷问题:Attention Sink

在标准的 Softmax Attention 计算中,Softmax 函数要求所有分数的和必须为 1(归一化)。

  • 问题: 如果当前的 Token 在上下文中确实没有任何值得关注的相关信息,Softmax 仍然强迫它必须把注意力分配出去。
  • 结果: 模型“学会”了一种投机取巧的办法——把这些多余的注意力全部分配给序列的第一个 Token(通常是起始符 <s> 或第一个单词)。
  • 形象比喻: 就像开会时大家没有想听的发言,但目光又不能乱飘,于是所有人就都盯着“主持人”(第一个 Token)发呆。这个“主持人”就成了注意力汇点(Attention Sink)。

举例理解:

  • 没有门控的基线模型(Baseline): 假设我们在处理第 20 层。无论当前的词是什么,模型平均会把 83% 的注意力权重都给到第 1 个 Token。这意味着模型其实并没有真正在“思考”上下文,而是在“倒垃圾”(把没用的权重扔给第一个词)。
  • 加了门控的模型(Gated): 引入门控后,第 1 个 Token 获得的注意力权重骤降到了 4%

为什么门控能解决这个问题?

因为门控允许模型输出 “全 0”

在标准 Attention 中,Softmax 强迫总和为 1,模型不得不找个地方(Sink)存这些值。有了门控 $Y \odot \sigma(...)$ 后,如果当前没有重要信息,门控直接输出 0,把整个 Attention 的输出抹除掉。模型不再需要找个“替罪羊”来承载多余的权重,从而彻底消除了 Attention Sink 现象。